package com.zw.user.service.impl;
/*
 *@program:b2c-cloud-store
 *@author:
 *@Time: 2022/11/21  19:05
 *@description: 用户服务实现类
 */

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zw.constant.UserConstants;
import com.zw.user.mapper.UserMapper;
import com.zw.param.UserCheckParam;
import com.zw.param.UserLoginParam;
import com.zw.pojo.User;
import com.zw.user.service.UserService;
import com.zw.utils.MD5Util;
import com.zw.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 检查账号是否可以业务
     * @param userCheckParam 账号参数 ，已经通过jsr 303注解校验完毕。
     * @return 检查结果 001 004
     */
    @Override
    public R check(UserCheckParam userCheckParam) {
//        参数封装
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name",userCheckParam.getUserName());
//        数据库查询
        Long total = userMapper.selectCount(queryWrapper);
        if(total == 0){
//            数据库中不存在，可用
            log.info("UserServiceImpl.check业务结束，结果:{}","账号可以使用");
            return R.ok("账号不存在，可以使用！");
        }
        log.info("UserServiceImpl.check业务结束，结果:{}","账号已存在，不能使用");
        return R.fail("账号已存在，不能注册");
    }

    /**
     * 用户注册业务
     *  1. 查库验证账号是否存在
     *  2. 账号不存在
     *      2.1 密码进行家吗
     *      2.2 插入数据库
     *  3. 账号存在
     *  4. 返回结果封装
     * @param user 参数已经校验，但是密码时明文，需要加密
     * @return 结果 001 004
     */
    @Override
    public R register(User user) {
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("user_name",user.getUserName());
        Long total = userMapper.selectCount(userQueryWrapper);
        if(total > 0){
//            账号存在,返回封装结果
            log.info("UserServiceImpl.register业务结束，结果:{}","账号已经存在，不可注册！");
            return R.ok("账号已经存在，不可注册");
        }
//        账号不存在，对密码进行MD5+盐进行加密处理
        String newPassword = MD5Util.encode(user.getPassword() + UserConstants.USER_SLAT);
        user.setPassword(newPassword);
        //插入数据库
        int rows = userMapper.insert(user);
        if(rows == 0){
            log.info("UserServiceImpl.register业务结束，结果:{}","数据插入失败，注册失败！");
            return R.fail("注册失败，请稍后再试！");
        }
        log.info("UserServiceImpl.register业务结束，结果:{}","数据插入成功，注册成功！");
        return R.ok("注册成功！");
    }

    /**
     * 用户登录业务
     * 1.  先加参数实体对象的密码进行加密
     * 2.  账号和密码进行数据库查询校验，返回完成user对象
     * 3.  判断返回结果
     * @param userLoginParam 参数已经校验，密码时明文，需要加密
     * @return 结果 001 004
     */
    @Override
    public R login(UserLoginParam userLoginParam) {
//        1. 密码加密
        String newPassword = MD5Util.encode(userLoginParam.getPassword() + UserConstants.USER_SLAT);
        userLoginParam.setPassword(newPassword);
//        创建封装对象
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name",userLoginParam.getUserName())
                .eq("password",userLoginParam.getPassword());
        User user = userMapper.selectOne(queryWrapper);
//        不返回password属性，配合JackJSON注解@JsonInclude(JsonInclude.Include.NON_NULL)使用。

        if (user == null){
            log.info("UserServiceImpl.login业务结束，结果:{}","账号或者密码错误");
            return R.fail("账号或者密码错误！");
        }
        user.setPassword(null);
        return R.ok("登录成功",user);
    }
}
